package com.kay.restdemo.server.constans;

import com.kay.restdemo.server.domain.ErrorInfo;
import com.kay.restdemo.server.exception.MyException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;


@RestControllerAdvice
public class GlobalExceptionHandler {
    private static final String logExceptionFormat = "Capture Exception By GlobalExceptionHandler: Code: %s Detail: %s";
    private static Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(value = MyException.class)
    public ErrorInfo<String> jsonErrorHandler(HttpServletRequest request, MyException e) throws Exception {
        ErrorInfo<String> r = new ErrorInfo<String>();
        r.setMessage(e.getMessage());
        r.setCode(ErrorInfo.ERROR);
        r.setData("Some Data");
        r.setUrl(request.getRequestURL().toString());
        return r;
    }

//    //运行时异常
//    @ExceptionHandler(RuntimeException.class)
//    public String runtimeExceptionHandler(RuntimeException ex) {
//        return resultFormat(1, ex);
//    }
//
//    //空指针异常
//    @ExceptionHandler(NullPointerException.class)
//    public String nullPointerExceptionHandler(NullPointerException ex) {
//        return resultFormat(2, ex);
//    }
//
//    //类型转换异常
//    @ExceptionHandler(ClassCastException.class)
//    public String classCastExceptionHandler(ClassCastException ex) {
//        return resultFormat(3, ex);
//    }
//
//    //IO异常
//    @ExceptionHandler(IOException.class)
//    public String iOExceptionHandler(IOException ex) {
//        return resultFormat(4, ex);
//    }
//
//    //未知方法异常
//    @ExceptionHandler(NoSuchMethodException.class)
//    public String noSuchMethodExceptionHandler(NoSuchMethodException ex) {
//        return resultFormat(5, ex);
//    }
//
//    //数组越界异常
//    @ExceptionHandler(IndexOutOfBoundsException.class)
//    public String indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException ex) {
//        return resultFormat(6, ex);
//    }
//
//    //400错误
//    @ExceptionHandler({HttpMessageNotReadableException.class})
//    public String requestNotReadable(HttpMessageNotReadableException ex) {
//        System.out.println("400..requestNotReadable");
//        return resultFormat(7, ex);
//    }
//
//    //400错误
//    @ExceptionHandler({TypeMismatchException.class})
//    public String requestTypeMismatch(TypeMismatchException ex) {
//        System.out.println("400..TypeMismatchException");
//        return resultFormat(8, ex);
//    }
//
//    //400错误
//    @ExceptionHandler({MissingServletRequestParameterException.class})
//    public String requestMissingServletRequest(MissingServletRequestParameterException ex) {
//        System.out.println("400..MissingServletRequest");
//        return resultFormat(9, ex);
//    }
//
//    //405错误
//    @ExceptionHandler({HttpRequestMethodNotSupportedException.class})
//    public String request405(HttpRequestMethodNotSupportedException ex) {
//        return resultFormat(10, ex);
//    }
//
//    //406错误
//    @ExceptionHandler({HttpMediaTypeNotAcceptableException.class})
//    public String request406(HttpMediaTypeNotAcceptableException ex) {
//        System.out.println("406...");
//        return resultFormat(11, ex);
//    }
//
//    //500错误
//    @ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class})
//    public String server500(RuntimeException ex) {
//        System.out.println("500...");
//        return resultFormat(12, ex);
//    }
//
//    //栈溢出
//    @ExceptionHandler({StackOverflowError.class})
//    public String requestStackOverflow(StackOverflowError ex) {
//        return resultFormat(13, ex);
//    }
//
//    //其他错误
//    @ExceptionHandler({Exception.class})
//    public String exception(Exception ex) {
//        return resultFormat(14, ex);
//    }
//
//    private <T extends Throwable> String resultFormat(Integer code, T ex) {
//        ex.printStackTrace();
//        log.error(String.format(logExceptionFormat, code, ex.getMessage()));
//        return JsonResult.failed(code, ex.getMessage());
//    }
}
